package com.coderside.fragment.RegEx;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 使用java正则表达式来解析html字符串常用的方法收集
 * @author 197370
 *
 */
public class ParseHtml {

	public static void main(String args[]) {

		String html = "<title>ABCD<title>sssssssss</title></title>gsdggasjkll<title>005</title>";
		List<String> resultList = getContext(html);
		for (String context : resultList) {
			System.out.println(context);
		}
	}

	public void regTest() {
		
	}

	/**
	 * 
	 * @param html
	 */
	public static void parseUrl(String html) {
		String regex = "<[aA]\\s*(href=[^>]+)>(.*?)</[aA]>";
		//在 dotall 模式中，表达式 . 可以匹配任何字符，包括行结束符。默认情况下，此表达式不匹配行结束符。
		Pattern p = Pattern.compile(regex, Pattern.DOTALL);
		Matcher matcher = null;
		matcher = p.matcher(html);
		while (matcher != null && matcher.find()) {
			int a = matcher.groupCount();
			while ((a--) > 0) {
				System.out.println(matcher.group(a));
			}
		}
	}

	/**
	 * 提取标签内的内容
	* 本例子是提取"<title>XXXX</title>"中的文字XXXX
	* 如果是其他的标签请把title获取其他的标签
	* @param html 要解析的html文档内容
	* @return 解析结果，可以多次匹配，每次匹配的结果按文档中出现的先后顺序添加进结果List
	*/
	public static List<String> getContext(String html) {
		List<String> resultList = new ArrayList<String>();
		Pattern p = Pattern.compile("<title>([^</title>]*)");//匹配<title>开头，</title>结尾的文档
		Matcher m = p.matcher(html);//开始编译
		while (m.find()) {
			resultList.add(m.group(1));//获取被匹配的部分
		}
		return resultList;
	}

	/**
	 * 匹配以字母开头的单词
	 * 不区分大小写
	 * 在使用的时候不要给第二个参数传递特殊字符、否则无法返回正确的结果
	 * @param candidate e.g("A Matcher examines the results of applying a pattern.")
	 * @param c 字母 e.g('a')
	 */
	public static void matchChar(String matchstr, char c) {
		String regex = "\\b" + c + "\\w*\\b";
		//不区分大小写
		Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(matchstr);
		String val = null;
		System.out.println("INPUT: " + matchstr);
		System.out.println("REGEX: " + regex + "\r\n");
		while (m.find()) {
			val = m.group();
			System.out.println("MATCH: " + val);
		}
		if (val == null) {
			System.out.println("NO MATCHES: ");
		}
	}

	/**
	 * 验证字符串content是否匹配正则表达式regEx
	 * @param regEx 正则表达式的字面量
	 * @param content 要匹配的字符串
	 * @return
	 */
	public static boolean matcherReg(String regEx, String content) {
		Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(content);
		return m.find();
	}

	/**
	 * 去掉字符串中的TAB、回车；\t：TAB；\r\n:回车；
	 * @param str 输入的字符串
	 * @return
	 */
	public static String replaceSpecialCharacter_t_r_n(String str) {
		Pattern pt = Pattern.compile("\t|\r|\n");
		Matcher mt = pt.matcher(str);
		return mt.replaceAll("");
	}

	/**
	 * 去掉字符串中的空格、TAB、回车；\\s*：空格；\t：TAB；\r\n:回车；
	 * @param str 输入的字符串
	 * @return
	 */
	public static String replaceSpecialCharacter_s_t_r_n(String str) {
		Pattern pt = Pattern.compile("\\s*|\t|\r|\n");
		Matcher mt = pt.matcher(str);
		return mt.replaceAll("");
	}

	/**
	 * 匹配中文字符
	 * @param chars
	 * @return
	 */
	public static boolean matchChar(String chars) {
		return matcherReg("[\u4E00-\u9FA5]", chars);
	}
}
